//
//  2_两数相加.swift
//  Swift-LeetCode
//
//  Created by 卢悦明 on 2024/3/8.
//
/**
 https://leetcode.cn/problems/add-two-numbers/description/
 给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。

 请你将两个数相加，并以相同形式返回一个表示和的链表。

 你可以假设除了数字 0 之外，这两个数都不会以 0 开头。
 输入：l1 = [2,4,3], l2 = [5,6,4]
 输出：[7,0,8]
 解释：342 + 465 = 807.
 示例 2：

 输入：l1 = [0], l2 = [0]
 输出：[0]
 示例 3：

 输入：l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
 输出：[8,9,9,9,0,0,0,1]

 */
import UIKit

class LinkAdd: NSObject {
    
    func QA() {
        var link =  LinkedList<Int>()
        let head = link.creatList(array: [1,2,6,3,4,5,6])
        let head1 = link.creatList(array: [1,2,6,3,4])
        LinkedList.printList(head)
        LinkedList.printList(head1)

        let newHead = addTwoNumbers(head, head1)
        LinkedList.printList(newHead)
    }
    
    func addTwoNumbers(_ l1: ListNode<Int>?, _ l2: ListNode<Int>?) -> ListNode<Int>? {
        if l1 == nil {
            return l2
        } else if l2 == nil {
            return l1
        }
        var l1 = l1
        var l2 = l2
        let newHead = ListNode(100)
        var current = newHead
        var jin1 = 0
        while l1 != nil || l2 != nil {
            let v1 = l1?.val ?? 0
            let v2 = l2?.val ?? 0
            var sum = v1 + v2 + jin1
            if sum > 9 {
                jin1 = sum / 10
                sum = sum % 10
            } else {
                jin1 = 0
            }
            let node = ListNode(sum)
            current.next = node
            current = node
            l1 = l1?.next
            l2 = l2?.next
        }
        if jin1 > 0 { // jin1 = 1
            current.next = ListNode(jin1)
        }
        return newHead.next

    }
}
